home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
BASIC
/
0006.ZIP
/
SORTEST.BAS
< prev
next >
Wrap
BASIC Source File
|
1983-07-11
|
8KB
|
168 lines
10 'DRIVER PROGRAM FOR TESTING SORT ROUTINES
20 '
30 'PROGRAM BY: LEE M. BUCK, ARLINGTON, VA.
40 '
50 CLS: KEY OFF: SCREEN 0,0,0,0: WIDTH 80: COLOR 7,0,0
60 '
70 PRINT :PRINT "STRING SORTING DEMO - COPYRIGHT 1983 LEE M BUCK":PRINT
80 PRINT "THIS DEMO IS SET UP FOR A 64K MACHINE. IF YOU HAVE MORE MEMORY"
90 PRINT " you may change line 280 to: CLEAR ,65535! from CLEAR ,38900!"
100 PRINT " and line 690 to: MEM.SIZE=96 from MEM.SIZE=64"
110 PRINT "THIS WILL ALLOW YOU TO USE ALL OF BASIC'S WORK SPACE."
120 PRINT :PRINT "THIS PROGRAM DEMONSTRATES THE ASSEMBLY LANGUAGE SORT MODULE"
130 PRINT "CONTAINED IN THE FILE 'SORT.BLD' - IT MUST BE ON THE DEFAULT DRIVE"
140 PRINT "BEFORE RUNNING THIS PROGRAM **NOTE** YOU DO NOT NEED THE ASSEMBLER!"
150 PRINT :PRINT "PLEASE READ THE FILE SORT.DOC FOR ADDITIONAL INFORMATION"
160 PRINT "ON THE ASSEMBLY LANGUAGE SUBROUTINE. IF YOU HAVE QUESTIONS "
170 PRINT "YOU MAY CONTACT ME AT THE ADDRESS IN THE SORT.DOC FILE. STUDY THIS"
180 PRINT "DEMO PROGRAM LISTING FOR ADDITIONAL TIPS ON USING THE SUBROUTINE."
190 PRINT :PRINT "THIS PROGRAM OR ASSEMBLY LANGUAGE SORT MODULE IS NOT FOR SALE"
200 PRINT "WITHOUT WRITTEN CONSENT OF THE AUTHOR. THEY ARE INTENDED FOR"
210 PRINT "FREE USE BY THE IBM PC USER COMMUNITY."
220 '
230 PRINT :PRINT "PRESS 'Esc' TO QUIT - SPACE BAR TO CONTINUE": BEEP
240 DEF SEG: POKE 106,0
250 Q$=INKEY$: IF Q$="" THEN 250 ELSE IF Q$=CHR$(27) THEN KEY ON: END
260 IF Q$<>CHR$(32) THEN 250
270 '
280 CLEAR ,38900! 'FOR 96K OR MORE CHANGE THIS TO CLEAR ,65535!
290 DEFINT A-Z: NDIM=INT(FRE(0)/2400)*100 '**PICK YOUR OWN VALUE FOR NDIM
300 DIM PTR(NDIM),PTRD(NDIM) '**IF YOU WANT MORE STRINGS
310 CLS: KEY OFF: FALSE=0: TRUE=NOT FALSE
320 '
330 ' ------------ convert time$ to sec and back ---------
340 DEF FNSEC!(TM$)=VAL(LEFT$(TM$,2))*3600+VAL(MID$(TM$,4,2))*60+VAL(RIGHT$(TM$ ,2))
350 DEF FNTIM$(SC!)=RIGHT$(STR$(INT(SC!/3600)),2)+":"+RIGHT$(STR$(INT((SC!- 3600*(INT(SC!/3600)))/60)),2)+":"+RIGHT$(STR$(SC!-3600*(INT(SC!/3600))- 60*(INT((SC!-3600*(INT(SC!/3600)))/60))),2)
360 GOTO 760
370 ' ------------ elapsed time subroutine ---------
380 TSEC!=FNSEC!(TIME$)
390 TELP!=TSEC!-TSTRT!:IF TELP!<0! THEN TELP!=TSEC!+(86400!-TSTRT!)
400 RETURN
410 ' -------- end elapsed time subroutine ---------
420 '
430 '---------- SHELL METZNER SORT ----------
440 COLOR 23,0: LOCATE ,1: PRINT "working";
450 K1=N
460 K1=INT(K1/2): IF K1=0 THEN 530 ELSE BEEP: PRINT "."; 'SIGNAL IT'S ALIVE
470 K2=N-K1: J=1
480 I=J
490 K3=I+K1: IF A$(I) < A$(K3) THEN 510
500 SWAP A$(I),A$(K3): I=I-K1: IF I>=1 THEN 490
510 J=J+1: IF J>K2 THEN 460
520 GOTO 480
530 RETURN
540 '
550 ' METHOD OF CALCULATING SEGMENT ADDRESS FOR LOADING MACHINE LANGUAGE
560 ' IN MEMORY. MEM.SIZE IS THE MACHINE MEMORY SIZE. THE MODULE IS LOADED
570 ' BELOW THIS AREA. MEM.SIZE IS EXPRESSED IN 'K'. FOR EXAMPLE, ON A 320K
580 ' MACHINE USING A 160K RAM DISK THE HIGHEST LOCATION IS 160K. MACHINE
590 ' LANGUAGE ROUTINES WILL BE LOADED JUST BELOW THIS.
600 ' PGM.SIZE IS THE SIZE OF THE MACHINE LANGUAGE MODULE. IF YOU DIDN'T
610 ' WRITE THE MODULE YOU HAVE TO TAKE THE AUTHORS WORD FOR IT OR LOAD
620 ' IT WITH DEBUG TO DETERMINE THE SIZE.
630 ' THIS IS 'K' MEMORY TIMES 1024/16 MINUS NO. OF 16 BYTE BLOCKS FOR CODE
640 '
650 SEGMENT=MEM.SIZE*64 - CINT(PGM.SIZE/16)
660 RETURN
670 '
680 'LOAD THE ASM. LANGUAGE SORT MODULE INTO MEMORY ABOVE BASIC'S SPACE
690 MEM.SIZE=64 'HIGH AVAIL. MEMORY LOCATION IN 'K'(MACHINE DEPENDENT)
700 PGM.SIZE=&H200 'SIZE OF THE MACHINE LANGUAGE PROGRAM
710 GOSUB 550 'CALCULATE "SEGMENT" TO LOAD SORT MODULE
720 ON ERROR GOTO 1590
730 DEF SEG=SEGMENT: BLOAD "SORT.BLD",0
740 RETURN
750 '
760 GOSUB 680 'LOAD THE ASM. MODULE
770 '
780 DIM A$(NDIM),AS$(NDIM)
790 WHILE INKEY$<>"":WEND 'CLEAR KEYBOARD BUFFER
800 NDIM$=STR$(NDIM): NDIM$=RIGHT$(NDIM$,LEN(NDIM$)-1)
810 CLS: PRINT: SOUND 1000,1
820 PRINT "HOW MANY STRINGS DO YOU WANT TO SORT (";NDIM$;: INPUT " MAX)";N
830 IF N<1 THEN N=20 'DEFAULT TO 20
840 IF N<=NDIM THEN 850 ELSE BEEP: GOTO 820
850 SOUND 1000,1
860 PRINT "WHAT IS THE MAXIMUM STRING SIZE (255 MAX)"
870 INPUT "(FOR DISPLAY PURPOSES 13 OR LESS IS BEST)";NMAX
880 IF NMAX<1 THEN NMAX=1 'DEFAULT TO 1
890 IF NMAX>255 THEN BEEP: NMAX=255
900 PRINT
910 PRINT "HOLD ON WHILE I GENERATE ";N;" RANDOM STRINGS"
920 RANDOMIZE (VAL(MID$(TIME$,4,2))*60+VAL(RIGHT$(TIME$,2))): X!=FRE("")
930 '
940 PRINT :PRINT "GENERATING STRING";TAB(30);"BYTES FREE";: LOCATE ,18
950 FOR I=1 TO N
960 L=RND*NMAX: IF L<1 THEN L=1 'LENGTH
970 C=RND*60+63 'CHARACTER
980 IF (C>64 AND C<91) OR (C>96 AND C<123) THEN 990 ELSE 970
990 A$(I)=STRING$(L,C): AS$(I)=A$(I): PTR(I)=I: PTRD(I)=I
1000 PRINT USING "#####";I;:LOCATE ,41:PRINT USING "#####";FRE(0);:LOCATE ,18
1010 IF FRE(0)>500 THEN 1050
1020 SOUND 500,6:SOUND 1200,5:SOUND 600,6:SOUND 1000,5
1030 PRINT: PRINT "STOPPING AT";I;" STRINGS...MEMORY GETTING LOW": N=I
1040 FOR II=1 TO 1000:NEXT II: GOTO 1070
1050 NEXT: PRINT
1060 '
1070 ' DO THE INTERPRETED SHELL-METZNER SORT
1080 PRINT: PRINT "BEGINNING INTERPRETER BASIC SHELL-METZNER SORT"
1090 PRINT "This will take about";SPC(5);" minutes";
1100 LOCATE ,POS(0)-12: PRINT USING "##.#";(.0006*N^1.3)
1110 NDOTS=CINT(LOG(N)/LOG(2)+.5):LOCATE ,8+NDOTS
1120 PRINT CHR$(17);CHR$(205);" finished when dots get here";
1130 TSTRT!=FNSEC!(TIME$)
1140 GOSUB 430 'DO A SHELL-METZNER SORT - 'REM' THIS LINE FOR SPEED
1150 GOSUB 370 'CALCULATE ELAPSED TIME
1160 METZTIM$=FNTIM$(TELP!)
1170 COLOR 7,0: LOCATE ,1: PRINT SPACE$(50);: LOCATE ,1
1180 BEEP : PRINT "SHELL-METZNER TIME ";METZTIM$;" (hh:mm:ss)"
1190 '
1200 ' ASM SORT IN ASCENDING ORDER
1210 BEEP: PRINT: PRINT "BEGINNING ASSEMBLY LANGUAGE SHELL-METZ SORT UP"
1220 TSTRT!=FNSEC!(TIME$)
1230 DEF SEG=SEGMENT 'SET THE SEGMENT LOCATION
1240 SORTUP=0 'SET THE ENTRY POINT
1250 CALL SORTUP(AS$(1),PTR(1),N)
1260 GOSUB 370 'CALCULATE ELAPSED TIME
1270 ASSYTIM$=FNTIM$(TELP!)
1280 BEEP : PRINT "ASM SHELL-METZ TIME ";ASSYTIM$;" (hh:mm:ss)"
1290 '
1300 ' ASM SORT IN DESCENDING ORDER
1310 BEEP: PRINT: PRINT "BEGINNING ASSEMBLY LANGUAGE SHELL-METZ SORT DOWN"
1320 TSTRT!=FNSEC!(TIME$)
1330 DEF SEG=SEGMENT 'SET THE SEGMENT LOCATION
1340 SORTDN=2 'SET THE ENTRY POINT FOR DESCENDING SORT
1350 CALL SORTDN(AS$(1),PTRD(1),N)
1360 GOSUB 370 'CALCULATE ELAPSED TIME
1370 ASSYTIM$=FNTIM$(TELP!)
1380 BEEP : PRINT "ASM SHELL-METZ TIME ";ASSYTIM$;" (hh:mm:ss)"
1390 '
1400 ' PRINT THE RESULTS
1410 PRINT: INPUT "DO YOU WANT TO DISPLAY THE RESULT (Y/N)";Q$
1420 IF LEFT$(Q$,1)<>"Y" AND LEFT$(Q$,1)<>"y" THEN 1550
1430 INPUT "PRINT TO SCREEN OR PRINTER (S/P) ";Q$
1440 IF LEFT$(Q$,1)="S" OR LEFT$(Q$,1)="s" THEN SCRN=TRUE: GOTO 1470
1450 IF LEFT$(Q$,1)="P" OR LEFT$(Q$,1)="p" THEN PRNT=TRUE: GOTO 1470
1460 BEEP: GOTO 1430
1470 PRINT :PRINT
1480 IF SCRN THEN PRINT "ORIGINAL","INTERP S-M","ASM UP","ASM DN":PRINT
1490 IF PRNT THEN LPRINT "ORIGINAL","INTERP S-M","ASM UP","ASM DN":LPRINT
1500 FOR I=1 TO N
1510 IF SCRN THEN PRINT AS$(I),A$(I),AS$(PTR(I)),AS$(PTRD(I))
1520 IF SCRN THEN IF (I MOD 20) = 0 THEN FOR II=1 TO 800: NEXT II 'pause
1530 IF PRNT THEN LPRINT AS$(I),A$(I),AS$(PTR(I)),AS$(PTRD(I))
1540 NEXT I
1550 PRINT: BEEP: INPUT "Want to try another test (Y/N)";Q$
1560 IF LEFT$(Q$,1)<>"Y" AND LEFT$(Q$,1)<>"y" THEN 1580
1570 ERASE A$,AS$ : GOTO 780 'START AGAIN
1580 KEY ON: ON ERROR GOTO 0: BEEP: END
1590 '
1600 ' ERROR TRAP FOR MISSING SORT.BLD FILE
1610 IF ERR<>53 OR ERL<>730 THEN 1650
1620 PRINT "CHECK DEFAULT DRIVE FOR FILE NAMED SORT.BLD"
1630 PRINT "RUN SORTBLD.BAS TO CREATE IT IF NECESSARY"
1640 GOTO 1660
1650 PRINT "ERROR";ERR;" AT LINE";ERL;" ... UNRECOVERABLE ..."
1660 SOUND 400,20: SOUND 200,25
1670 GOTO 1580